// #include "PageCache.h"

// PageCache PageCache::_inst;

// // 哈希map版本加锁
// // // 内存块地址转换为Span地址
// // Span *PageCache::MapAddressToSpan(void *obj)
// // {
// //     pthread_mutex_lock(&_pageMtx); // 加页缓存锁
// //     PAGE_ID pageId = (PAGE_ID)obj >> PAGE_SHIFT;
// //     auto it = _idMapToSpan.find(pageId);
// //     if (it == _idMapToSpan.end())
// //         assert(false);
// //     pthread_mutex_unlock(&_pageMtx); // 解页缓存锁
// //     return it->second;
// // }

// // 基数树版本不加锁
// // 内存块地址转换为Span地址
// Span *PageCache::MapAddressToSpan(void *obj)
// {
//     PAGE_ID pageId = (PAGE_ID)obj >> PAGE_SHIFT;
//     Span* ret = (Span*)_idMapToSpan.get(pageId);
//     assert(ret != nullptr);
//     return ret;
// }

// // 给中心缓存一个Span
// Span *PageCache::FetchFromPageCache(int k)
// {
//     // 申请比128页大的情况
//     if (k >= NPAGE)
//     {
//         Span *span = GetSpanPool().New();
//         void *ptr = SystemAlloc(k);

//         span->_pageID = (PAGE_ID)ptr >> PAGE_SHIFT;
//         span->_n = k;

//         // 添加映射
//         //_idMapToSpan[span->_pageID] = span;
//         _idMapToSpan.set(span->_pageID, span);
//         return span;
//     }
//     else
//     {
//         // 在当前位置寻找span
//         if (!_pc_spanlists[k].Empty())
//         {
//             // 将span取出来
//             Span *span = _pc_spanlists[k].PopFront();
//             // 将页号和Span映射关系保存起来
//             for (size_t i = 0; i < span->_n; i++)
//             {
//                 //_idMapToSpan[span->_pageID + i] = span;
//                 _idMapToSpan.set(span->_pageID + i, span);
//             }
//             return span;
//         }
//         // 向后寻找,找一个比k大的Span，进行切分
//         for (size_t i = k + 1; i < NPAGE; i++)
//         {
//             if (!_pc_spanlists[i].Empty())
//             {
//                 Span *kSpan = GetSpanPool().New();
//                 // 将Span取出来
//                 Span *nSpan = _pc_spanlists[k].PopFront();
//                 // 切分nSpan
//                 kSpan->_pageID = nSpan->_pageID;
//                 kSpan->_n = k;

//                 nSpan->_n -= k;
//                 nSpan->_pageID += k;

//                 // 将页号和Span的映射关系保存起来
//                 for (size_t i = 0; i < k; i++)
//                 {
//                     //_idMapToSpan[kSpan->_pageID + i] = kSpan;
//                     _idMapToSpan.set(kSpan->_pageID + i, kSpan);
//                 }
//                 //_idMapToSpan[nSpan->_pageID] = nSpan;
//                 //_idMapToSpan[nSpan->_pageID + nSpan->_n - 1] = nSpan;
//                 _idMapToSpan.set(nSpan->_pageID, nSpan);
//                 _idMapToSpan.set(nSpan->_pageID + nSpan->_n - 1, nSpan);

//                 // 将nSpan放入新的位置
//                 _pc_spanlists[nSpan->_n].PushFront(nSpan);
//                 return kSpan;
//             }
//         }
//         // 如果都没有的话，就需要向OS申请一个128页的Span了
//         void *ptr = SystemAlloc(NPAGE - 1);
//         Span *newSpan = GetSpanPool().New();
//         newSpan->_pageID = (PAGE_ID)ptr >> PAGE_SHIFT;
//         newSpan->_n = NPAGE - 1;

//         return FetchFromPageCache(k);
//     }
// }

// // 回收中心缓存中的Span函数
// void PageCache::ReleaseSpanToRageCache(Span *span)
// {
//     assert(span);
//     if (span->_n > NPAGE - 1)
//     {
//         SystemFree(span);
//         GetSpanPool().Delete(span);
//     }
//     else
//     {
//         // 向前合并
//         while (1)
//         {
//             PAGE_ID prevId = span->_pageID - 1;
//             // auto it = _idMapToSpan.find(prevId);
//             // if (it == _idMapToSpan.end())
//             //     break;
//             Span* ret = (Span*)_idMapToSpan.get(prevId);
//             if(ret == nullptr) break;

//             // 前面的span正在使用 或者 两个span加在一起比128页还大的话，就不能合并了
//             // Span *prevSpan = it->second;
//             Span *prevSpan = ret;
//             if (prevSpan->_isUse == true)
//                 break;
//             if (prevSpan->_n + span->_n > NPAGE - 1)
//                 break;

//             // 清理span数据
//             span->_freelist = nullptr;
//             span->objSize = 0;
//             // 合并
//             span->_pageID = prevSpan->_pageID;
//             span->_n += prevSpan->_n;
//             // 将prevSpan结构体释放
//             _pc_spanlists[prevSpan->_n].Erase(prevSpan);
//             GetSpanPool().Delete(prevSpan);
//         }
//         // 向后合并
//         while (1)
//         {
//             PAGE_ID nextId = span->_pageID + span->_n;
//             // auto it = _idMapToSpan.find(nextId);
//             // if (it == _idMapToSpan.end())
//             //     break;
//             Span* ret = (Span*)_idMapToSpan.get(nextId);
//             if(ret == nullptr) break;

//             // 前面的span正在使用 或者 两个span加在一起比128页还大的话，就不能合并了
//             // Span *nextSpan = it->second;
//             Span *nextSpan = ret;
//             if (nextSpan->_isUse == true)
//                 break;
//             if (nextSpan->_n + span->_n > NPAGE - 1)
//                 break;

//             // 清理span数据
//             span->_freelist = nullptr;
//             span->objSize = 0;
//             // 合并
//             span->_n += nextSpan->_n;
//             // 将prevSpan结构体释放
//             _pc_spanlists[nextSpan->_n].Erase(nextSpan);
//             GetSpanPool().Delete(nextSpan);
//         }
//         // 把span链入新的位置
//         _pc_spanlists[span->_n].PushFront(span);
//         // 添加映射
//         // _idMapToSpan[span->_pageID] = span;
//         // _idMapToSpan[span->_pageID + span->_n - 1] = span;
//          _idMapToSpan.set(span->_pageID, span);
//          _idMapToSpan.set(span->_pageID + span->_n - 1, span);

//     }
// }